# 计算力学结果
import math
from typing import List

from algs.common import OilWellData


class InterCheckResult:
    # 深度
    depth: float
    # 张力
    F: float
    # 正压力
    N: float
    # 正压力之和
    N_All: float



# 计算参数
class PassCheckResult:
    # 测井深度
    depth: float
    # 倾斜角
    inclination: float
    # 井斜角变化率
    inclination_rate: float
    # 方位角
    azimuth: float
    # 方位角变化率
    azimuth_rate: float
    # # 狗腿度
    dog_leg_severity: float
    # 弯矩
    bending_moment: float
    # 曲率半径
    curvature_radius: float
    #########################################
    # 条件绘图参数
    # 正压力
    N: float
    # 张力
    F: float
    # 正压力之和
    N_All: float


# 基础参数
class BasePassParams:
    # 测井工具在空气中的重量 kg/m
    m1: float
    # 工具摩擦系数
    mu1: float
    # 流体密度
    rou_m: float
    # 工具长度
    L1: float
    # 测井工具外径
    d1: float
    # 一开套管内径 DC1
    dc1: float
    # 一开套管的下入深度Lc1
    lc1: float
    # 二开或n开套管内径 Dcn
    dcn: float
    # 二开或n开套管的下入深度Lcn
    lcn: float
    # 裸眼段内径Doh
    doh: float
    # 井下工具的下放速度v
    v: float
    # 裸眼段的深度L_OH
    loh: float
    # 液体的动力粘度
    tao_p: float
    # 仪器串第一最大直径
    d_max1: float
    # 仪器串第二最大直径
    d_max2: float


# 计算所需参数 -> 根据基础参数可以计算出来的结果
class PassParams:
    # 工具长度
    L1: float
    # 测井工具外径
    d1: float
    # 测井工具在空气中的重量 kg/m3
    m1: float
    # 流体密度
    rou_m: float
    # 工具摩擦系数
    mu1: float
    # 测井仪器的单位浮重
    w1: float
    # 一开套管内径 DC1
    dc1: float
    # 一开套管的下入深度Lc1
    lc1: float
    # 二开或n开套管内径 Dcn
    dcn: float
    # 二开或n开套管的下入深度Lcn
    lcn: float
    # 裸眼段内径Doh
    doh: float
    # 井下工具的下放速度v
    v: float
    # 裸眼段的深度L_OH
    loh: float
    # 液体的动力粘度
    tao_p: float
    # 仪器串第一最大直径
    d_max1: float
    # 仪器串第二最大直径
    d_max2: float


def get_test_params() -> BasePassParams:
    params: BasePassParams = BasePassParams()
    params.m1 = 27.67
    params.mu1 = 0.28
    params.rou_m = 1300
    params.d1 = 0.09
    params.L1 = 15
    params.dc1 = 0.133
    params.lc1 = 260
    params.doh = 0.21
    params.v = 3.5/60
    params.loh = 2100
    params.tao_p = 0.0058
    params.d_max1 = 0.09
    params.d_max2 = 0.08
    return params


# 基础参数预处理
def params_init(params: BasePassParams) -> PassParams:
    t: PassParams = PassParams()
    t.m1 = params.m1
    t.mu1 = params.mu1
    t.rou_m = params.rou_m
    t.L1 = params.L1
    t.d1 = params.d1
    t.dc1 = params.dc1
    t.lc1 = params.lc1
    t.doh = params.doh
    t.v = params.v
    t.loh = params.loh
    t.tao_p = params.tao_p
    t.d_max1 = params.d_max1
    t.d_max2 = params.d_max2
    t.w1 = get_instrument_unit_weight(t)

    return t


# 公共函数
# 数据初始化
def data_init(_list_: List[OilWellData]) -> List[PassCheckResult]:
    result_arr: List[PassCheckResult] = []
    for item in _list_:
        t: PassCheckResult = PassCheckResult()
        t.depth = item.depth
        t.inclination = item.inclination
        t.azimuth = item.azimuth
        t.dog_leg_severity = item.dog_leg_severity
        t.inclination_rate = math.radians(item.inclination_rate) / 30
        t.azimuth_rate = math.radians(item.azimuth_rate) / 30
        t.curvature_radius = item.curvature_radius
        result_arr.append(t)
    return result_arr


# 测井仪器的单位浮重
def get_instrument_unit_weight(params: PassParams) -> float:
    return (get_instrument_uint_density(params) - params.rou_m) * get_instrument_area(params) * 9.81


# 测井仪器的截面面积
def get_instrument_area(params: PassParams) -> float:
    return math.pi * 0.25 * math.pow(params.d1, 2)


# 测井仪器的单位密度
def get_instrument_uint_density(params: PassParams) -> float:
    return params.m1 / get_instrument_area(params)




